package util

import (
	"bytes"
	"io/ioutil"
	"log"
	"os"
	"strings"
	"time"

	"github.com/troian/toml"
)

const (
	DirMode1 = "\\YYYY\\"
	DirMode2 = "\\YYYY\\MM\\"
	DirMode3 = "\\YYYY\\MM\\DD\\"
)

type Config struct {
	InputPath         string   `comment:"输入文件夹路径，如：c:\\\\input"`
	OutputPath        string   `comment:"输出文件夹路径，如：c:\\\\output"`
	SufList           []string `comment:"文件筛选后缀"`
	IsSubDir          bool     `comment:"是否扫描子目录"`
	IsRename          bool     `comment:"是否重命名文件"`
	NewFilenameFormat string   `comment:"重命名文件格式"`
	NewDirMode        int      `comment:"输出文件时新建文件夹路径格式\n1：{输出根目录}\\年\\\n2：{输出根目录}\\年\\月\\\n3：{输出根目录}\\年\\月\\日\\"`
	IsMove            bool     `comment:"是否移动文件，是：移动源文件，否：复制源文件"`
	IsDoNoExitDate    bool     `comment:"是否操作没有拍摄日期记录的媒体文件"`
	Prefix            string   `comment:"重命名文件前缀"`
	Suffix            string   `comment:"重命名文件后缀"`
	NewDirMode1       string   `toml:"-" comment:""`
}

var defaultCfg Config

func init() {
	defaultCfg = Config{
		InputPath:         "",
		OutputPath:        "",
		SufList:           []string{".jpg", ".mov", ".mp4", ".avi", ".3gp", ".png", ".amr", ".mpg", ".wmv", ".rmvb", ".mp3"}, //要处理的后缀名
		IsSubDir:          true,
		IsRename:          true,
		NewFilenameFormat: "YYYY-MM-DD HH-mm-ss", //重命名格式
		NewDirMode:        3,
		IsMove:            false,
		IsDoNoExitDate:    false, //是否处理没有拍摄日期的文件
		Prefix:            "",
		Suffix:            "",
	}
}

func ReadConfig(cfgPath string) (*Config, bool) {
	if ok, _ := IsFileExists(cfgPath); !ok {
		MyLogger.Println("配置文件不存在，已经自动生成新的配置文件。")
		SaveConfigFile(cfgPath, defaultCfg)
		return nil, false
	}

	cfg, _ := LoadConfigFile(cfgPath)
	switch cfg.NewDirMode {
	case 1:
		cfg.NewDirMode1 = DirMode1
	case 2:
		cfg.NewDirMode1 = DirMode2
	case 3:
		cfg.NewDirMode1 = DirMode3
	}

	//MyLogger.Printf("%#v\n", cfg)
	/*MyLogger.PrintfWithConsole("输入目录：%v\n输出目录：%v\n是否重命名：%v\n重命名格式：%v\n是否遍历子目录：%v\n是否移动文件：%v\n是否操作没有EXIF信息的文件：%v\n输出文件时新建文件夹路径格式：%v\n",
		cfg.InputPath,
		cfg.OutputPath,
		cfg.IsRename,
		cfg.NewFilenameFormat,
		cfg.IsSubDir,
		cfg.IsMove,
		cfg.IsDoNoExitDate,
	)*/

	buf := new(bytes.Buffer)
	if err := toml.NewEncoder(buf).Encode(cfg); err != nil {
		log.Fatal(err)
	}
	MyLogger.PrintlnWithConsole("=========读取到的config文件=========")
	MyLogger.PrintfWithConsole(buf.String())
	MyLogger.PrintlnWithConsole("===============分割线===============")
	return &cfg, true
}

func SaveConfigFile(filename string, cfg Config) (bool, error) {
	buf := new(bytes.Buffer)
	if err := toml.NewEncoder(buf).Encode(cfg); err != nil {
		log.Fatal(err)
	}
	err := ioutil.WriteFile(filename, buf.Bytes(), os.ModeAppend)
	if err != nil {
		return false, err
	}
	return true, nil
}

func LoadConfigFile(filename string) (Config, error) {
	cfg := Config{}
	_, err := toml.DecodeFile(filename, &cfg)
	if err != nil {
		return cfg, err
	}
	return cfg, err
}

func TimeString(format string, time time.Time) string {
	return time.Format(TimeFormatStreadBufFromFile(format))
}

func TimeFormatStreadBufFromFile(f string) string {
	f = strings.Replace(f, "YYYY", "2006", -1)
	f = strings.Replace(f, "YY", "06", -1)
	f = strings.Replace(f, "MM", "01", -1)
	f = strings.Replace(f, "DD", "02", -1)
	f = strings.Replace(f, "HH", "15", -1)
	f = strings.Replace(f, "mm", "04", -1)
	f = strings.Replace(f, "ss", "05", -1)
	return f
}
